// 通用工具函数

/**
 * 格式化日期时间
 * @param {Date|string|number} date 日期对象、时间戳或日期字符串
 * @param {string} format 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return ''
  
  // 如果传入的是时间戳（数字）或日期字符串，转为Date对象
  if (typeof date !== 'object') {
    date = new Date(date)
  }
  
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hours = date.getHours()
  const minutes = date.getMinutes()
  const seconds = date.getSeconds()
  
  // 补零函数
  const pad = (n) => n.toString().padStart(2, '0')
  
  return format
    .replace('YYYY', year)
    .replace('MM', pad(month))
    .replace('DD', pad(day))
    .replace('HH', pad(hours))
    .replace('mm', pad(minutes))
    .replace('ss', pad(seconds))
}

/**
 * 格式化字节数为易读形式
 * @param {number} bytes 字节数
 * @param {number} decimals 小数位数
 * @returns {string} 格式化后的字符串，如 '1.5 MB'
 */
export function formatBytes(bytes, decimals = 2) {
  if (bytes === 0 || bytes === undefined || bytes === null) return '0 B'
  
  const k = 1024
  const dm = decimals < 0 ? 0 : decimals
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
}

/**
 * 页面级消息管理类
 * 用于在单个页面内创建独立的消息提示系统，避免使用全局消息组件
 */
export class PageMessageManager {
  constructor() {
    this.messages = []
    this.counter = 0
  }
  
  /**
   * 添加一条消息
   * @param {string} content 消息内容
   * @param {string} type 消息类型 'info'|'success'|'warning'|'error'
   * @param {number} duration 显示时间（毫秒）
   * @returns {number} 消息ID
   */
  add(content, type = 'info', duration = 3000) {
    const id = this.counter++
    const message = { id, content, type, timestamp: Date.now() }
    this.messages.push(message)
    
    // 设置自动移除
    if (duration > 0) {
      setTimeout(() => {
        this.remove(id)
      }, duration)
    }
    
    return id
  }
  
  /**
   * 移除一条消息
   * @param {number} id 消息ID
   * @returns {boolean} 是否成功移除
   */
  remove(id) {
    const index = this.messages.findIndex(msg => msg.id === id)
    if (index !== -1) {
      this.messages.splice(index, 1)
      return true
    }
    return false
  }
  
  /**
   * 清空所有消息
   */
  clear() {
    this.messages = []
  }
  
  /**
   * 创建各种类型的快捷方法
   */
  info(content, duration = 3000) {
    return this.add(content, 'info', duration)
  }
  
  success(content, duration = 3000) {
    return this.add(content, 'success', duration)
  }
  
  warning(content, duration = 3000) {
    return this.add(content, 'warning', duration)
  }
  
  error(content, duration = 3000) {
    return this.add(content, 'error', duration)
  }
}

/**
 * 防抖函数
 * @param {Function} fn 要执行的函数
 * @param {number} delay 延迟时间（毫秒）
 * @returns {Function} 防抖处理后的函数
 */
export function debounce(fn, delay) {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

/**
 * 节流函数
 * @param {Function} fn 要执行的函数
 * @param {number} delay 间隔时间（毫秒）
 * @returns {Function} 节流处理后的函数
 */
export function throttle(fn, delay) {
  let last = 0
  return function(...args) {
    const now = Date.now()
    if (now - last > delay) {
      last = now
      fn.apply(this, args)
    }
  }
} 